#pragma once

#include <gtkmm.h>
#include "GtkBoard.hpp"

class MyApp : public Gtk::Application{
public:
    //创建Application
    static Glib::RefPtr<MyApp> create();
protected:
    //初始化App类
    MyApp();
    //重载默认函数
    void on_startup() override;
    void on_activate() override;
private:
    Glib::RefPtr<Gtk::Builder> ref_builder;
    //窗口主界面
    Gtk::Window *main_window;//主窗口
    Gtk::Stack *main_stack;//界面切换器
    Gtk::PopoverMenu *popover;//主菜单
    Gtk::AspectFrame *new_game_screen,*custom_game_screen;//游戏选择界面与自定义页面
    Gtk::SpinButton *rows_spin_button,*cols_spin_button;//游戏行数与列数设置界面
    Gtk::ComboBoxText *gamemode_combo;//游戏模式选择框

    //菜单实现相关
    Glib::RefPtr<Gtk::Builder> menu_builder;
    //用于菜单信号的函数
    void about_game();
    void game_info();

    //游戏界面构件
    Gtk::Button *play_pause_btn;
    Gtk::Box *main_screen;//游戏主界面
    Gtk::Label *time_label,*pause_label;//游戏时间标签与暂停按钮的标签
    Gtk::ScrolledWindow *scrolled;//放置棋盘
    GtkBoard *chess_board;//棋盘部分
    Gtk::Label *winner_label;

    //“关于”对话框构件
    Gtk::Dialog *info_dialog;//游戏介绍对话框
    Gtk::Notebook *info_notebook;
    Gtk::Image *about_image;//图片介绍

    //计时器实现
    sigc::connection mytimer;
    const int timer_value;
    bool on_timeout();
    int time_sum;
    char time_string[20];

    //后端连接部分
    int curr_rows,curr_cols;//当前的行列数
    int game_mode;//游戏模式
    gomoku::player_vs_player *game;//普通模式下的游戏主类
    gomoku::player winner;//赢家
    bool game_running;//判断游戏是否暂停

    //标准棋盘大小
    void create_board(int rows,int columns);//创建棋盘
    void create_board(int init_status,gomoku::point_status *init_layout);//从已有布局中加载棋盘
    void board_normal_mode();//15x15大小棋盘,普通模式
    void board_fight_mode();//15x15大小棋盘,混战模式
    void board_load_file();//从文件加载棋盘存档
    void board_custom_size();//自定义棋盘大小与游戏模式

    //游戏界面相关
    void new_game();//改变棋盘大小并重开
    void start_game();//开始游戏
    void undo_game();//悔棋(恢复至上一次的状态)
    void custom_game();//自定义棋盘大小
    void custom_cancel();//从自定义页面退回到主页面
    void pause_game();//暂停游戏进程
    void repeat_game();//重开游戏
    void save_game();//保存游戏进度
    bool save_game_file(const char *filename, gomoku::game &game);
};
